home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 April
/
EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso
/
EARCD
/
comm
/
bbs
/
Hydra11s.lha
/
HBBS
/
Source
/
Oberon
/
AutoJoin.mod
< prev
next >
Wrap
Text File
|
1996-07-06
|
7KB
|
302 lines
MODULE AutoJoin;
IMPORT
a:= Arguments, ac:= ANSIConsole, st:= Strings, cv:= Conversions, io, s:= SYSTEM,
e:= Exec, d:= Dos, ol:= OberonLib,
bo:= BBSColours, bs:= BBSStructures, bc:= BBSConstants,
hn:= HBBSNode, hc:= HBBSCommon, req:= Requests;
CONST EOF = -1; LF = 0AH;
LineLength = 80;
LTRUE = 1; LFALSE = 0;
TYPE
LineNodePtr = UNTRACED POINTER TO LineNode;
LineNode = STRUCT
prev, next: LineNodePtr;
text: ARRAY LineLength OF CHAR;
END;
VAR
BBSGlobal: bs.BBSGlobalDataPtr;
NnD: bs.NodeDataPtr;
NodeNum: LONGINT;
sLine: ARRAY 80 OF CHAR;
argList: LineNodePtr;
CountArgs: INTEGER;
file: d.FileHandlePtr;
textPool: e.MemPoolPtr;
menuName: LineNodePtr;
PROCEDURE cleanup(num: LONGINT);
BEGIN
IF hn.HBBSNodeBase # NIL THEN
hn.HBBSCleanUpDoor;
e.CloseLibrary(hn.HBBSNodeBase);
hn.HBBSNodeBase:= NIL;
END;
IF hc.HBBSCommonBase # NIL THEN
hc.HBBSCleanUpCommon;
e.CloseLibrary(hc.HBBSCommonBase);
hc.HBBSCommonBase:= NIL;
END;
IF num # 0 THEN
io.WriteString("Door Error = ");
io.WriteInt(num, 0); io.WriteLn;
(* io.Format("Door Error = %d\n", s.ADR(num)) *)
END;
END cleanup;
PROCEDURE init(name: e.STRPTR);
BEGIN
IF hc.HBBSCommonBase = NIL THEN
cleanup(1); RETURN
END;
IF NOT hc.HBBSInitCommon() THEN
cleanup(2); RETURN
END;
IF hn.HBBSNodeBase = NIL THEN
cleanup(3); RETURN
END;
IF NOT hn.HBBSInitDoor(SHORT(NodeNum), name) THEN
cleanup(4); RETURN
END;
END init;
PROCEDURE AddNode(VAR list: LineNodePtr; at: INTEGER): LineNodePtr;
VAR last, new: LineNodePtr;
dummy: LineNode;
BEGIN
new:= e.AllocPooled(textPool, s.SIZE(dummy));
IF list = NIL THEN
IF new # NIL THEN
new^.prev:= NIL;
new^.next:= NIL;
END;
list:= new;
ELSE
IF at <= 1 THEN
IF new # NIL THEN
new^.prev:= NIL;
new^.next:= list;
list^.prev:= new;
list:= new;
END;
ELSE
last:= list;
WHILE (last^.next # NIL) & (at > 2) DO
last:= last^.next; at:= at - 1
END;
IF new # NIL THEN
new^.next:= last^.next;
new^.prev:= last;
IF last^.next # NIL THEN
last^.next^.prev:= new
END;
last^.next:= new;
END;
END;
END;
RETURN new;
END AddNode;
PROCEDURE DeleteNode(VAR list: LineNodePtr; at: INTEGER);
VAR this: LineNodePtr;
dummy: LineNode;
BEGIN
IF list # NIL THEN
this:= list;
IF at <= 1 THEN
list:= this^.next;
IF list # NIL THEN list^.prev:= NIL END;
ELSE
WHILE (this^.next # NIL) & (at > 1) DO
this:= this^.next; at:= at - 1
END;
IF this^.prev # NIL THEN
this^.prev^.next:= this^.next
END;
IF this^.next # NIL THEN
this^.next^.prev:= this^.prev;
END;
END;
e.FreePooled(textPool, this, s.SIZE(dummy));
END;
END DeleteNode;
PROCEDURE GetNode(list: LineNodePtr; at: INTEGER): LineNodePtr;
BEGIN
IF list = NIL THEN RETURN NIL END;
WHILE (list # NIL) & (at > 1) DO
list:= list^.next; at:= at - 1;
END;
RETURN list;
END GetNode;
PROCEDURE ReqNumber(l: LONGINT);
VAR str: ARRAY 80 OF CHAR;
ok: BOOLEAN;
count: INTEGER; factor: LONGINT;
BEGIN
factor:= 1000000000; count:= 10;
WHILE (ABS(l) < factor) & (count > 1) DO count:= count - 1; factor:= factor DIV 10 END;
ok:= cv.IntToString(l, str, count);
IF ok THEN
req.BreakPoint(str)
END;
END ReqNumber;
VAR str: ARRAY 80 OF CHAR;
PROCEDURE PutNumber(l: LONGINT);
VAR ok: BOOLEAN;
count: INTEGER; factor: LONGINT;
BEGIN
factor:= 1000000000; count:= 10;
WHILE (ABS(l) < factor) & (count > 1) DO count:= count - 1; factor:= factor DIV 10 END;
ok:= cv.IntToString(l, str, count);
IF ok THEN
hn.DOORWriteText(s.ADR(str));
END;
END PutNumber;
VAR str1: ARRAY 2 OF CHAR;
PROCEDURE PutChar(ch: CHAR);
BEGIN
str1[0]:= ch; str1[1]:= CHR(0);
hn.DOORWriteText(s.ADR(str));
END PutChar;
PROCEDURE ReplyArgs;
VAR
i: INTEGER;
thisArg: LineNodePtr;
BEGIN
i:= 1;
LOOP
thisArg:= GetNode(argList, i);
IF thisArg # NIL THEN hn.DOORWriteText(s.ADR(thisArg^.text)) END;
hn.DOORWriteText(s.ADR(" "));
IF thisArg = NIL THEN EXIT END;
i:= i + 1
END;
END ReplyArgs;
PROCEDURE AllowAccess(ConfNum: LONGINT): BOOLEAN;
VAR tmpConf: bs.ConfDataPtr;
tmpBoolNode: bs.BoolNodePtr;
BEGIN
IF (ConfNum > 0) & (ConfNum <= BBSGlobal^.Conferences) THEN
tmpConf:= hc.GetNode(BBSGlobal^.ConfList, SHORT(ConfNum) -1);
IF tmpConf^.ConfAccess > NnD^.User.CallData.Access THEN
RETURN FALSE
ELSE
tmpBoolNode:= hc.GetNode(NnD^.User.ConfAcs.Access, SHORT(ConfNum) -1);
RETURN tmpBoolNode^.Boolean = bc.LTRUE;
END;
ELSE
RETURN FALSE;
END;
END AllowAccess;
PROCEDURE DoorMain;
VAR
ConfNum: LONGINT;
BEGIN
(* ReplyArgs; *)
IF cv.StringToInt(NnD^.ActiveDoor^.SystemOptions^, ConfNum) THEN
IF AllowAccess(ConfNum) THEN
NnD^.CurrentConf:= hc.GetNode(BBSGlobal^.ConfList, SHORT(ConfNum) - 1);
NnD^.User.NormalData.LastConf:= ConfNum;
NnD^.User.CallData.LastConf:= ConfNum;
NnD^.MaxDIZLines:= NnD^.CurrentConf^.MaxDIZLines;;
hn.HBBSSetAccess;
hn.HBBSSetBBSCols;
hn.DOORWriteText(s.ADR(""));
ELSE
IF hn.DOORPausePrompt(s.ADR("Access denied...press any key")) = bc.LTRUE THEN END;
END;
ELSIF st.Occurs(NnD^.ActiveDoor^.SystemOptions^,"PREFS") >= 0 THEN
ConfNum:= NnD^.User.NormalData.PreferedConf;
IF ConfNum > 0 THEN
IF AllowAccess(ConfNum) THEN
NnD^.CurrentConf:= hc.GetNode(BBSGlobal^.ConfList, SHORT(ConfNum) - 1);
NnD^.User.NormalData.LastConf:= ConfNum;
NnD^.User.CallData.LastConf:= ConfNum;
NnD^.MaxDIZLines:= NnD^.CurrentConf^.MaxDIZLines;
hn.HBBSSetAccess;
hn.HBBSSetBBSCols;
ELSE
IF hn.DOORPausePrompt(s.ADR("Prefered conf is not valide, access denied"))= bc.LTRUE THEN END;
END;
END;
hn.DOORWriteText(s.ADR(""));
ELSE
hn.DOORWriteText(s.ADR("Conference Number #"));
hn.DOORWriteText(NnD^.ActiveDoor^.SystemOptions);
hn.DOORWriteText(s.ADR(" Does'nt exist..."));
IF hn.DOORPausePrompt(s.ADR("press any key")) = bc.LTRUE THEN END;
END;
END DoorMain;
PROCEDURE ParseArgs;
VAR
i: INTEGER;
newArg: LineNodePtr;
s: ARRAY 80 OF CHAR;
ok: BOOLEAN;
BEGIN
CountArgs:= a.NumArgs();
i:= 1;
WHILE i <= CountArgs DO
newArg:= AddNode(argList, MAX(INTEGER));
IF newArg # NIL THEN
a.GetArg(i, newArg^.text);
ELSE
CountArgs:= i;
END;
i:= i + 1
END;
END ParseArgs;
VAR
newArg: LineNodePtr;
dummy: LineNode;
BEGIN
textPool:= e.CreatePool(LONGSET{}, s.SIZE(dummy), s.SIZE(dummy));
ParseArgs;
IF CountArgs > 0 THEN
newArg:= GetNode(argList, 1);
IF cv.StringToInt(newArg^.text, NodeNum) THEN
init(s.ADR("Auto-join Conference"));
IF hc.HBBSCommonBase # NIL THEN
BBSGlobal:= hc.HBBSGimmeBBS();
IF BBSGlobal # NIL THEN
NnD:= hc.HBBSNodeDataPtr(SHORT(NodeNum));
IF NnD # NIL THEN
DoorMain;
END;
END;
END;
cleanup(0);
ELSE
io.WriteString("Invalid Param for door!\n")
END;
ELSE
io.WriteString("No Param for door!\n");
END;
CLOSE
cleanup(0);
e.DeletePool(textPool);
END AutoJoin.